package com.selftool.util;


import org.apache.commons.lang3.exception.ExceptionUtils;

import java.io.*;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Map;
import java.util.Properties;

/**
 * CommonUtil：通用工具类
 * @author	CYQ
 * @date	2021年11月30日 上午10:31:03
 * @version	1.0.0
*/ 
public class CommonUtil {
	private static CommonUtil util = new CommonUtil();
	private CommonUtil(){}
	public static CommonUtil getCommonUtil() {
		return util;
	}

	private static Properties props = null ;//配置文件

	public static String initstr(Object str){
		return (str == null ? "" : str).toString();
	}

	public static Integer initInteger(Object data){
		if(data == null) {
			return null;
		}
		String dataStr = initstr(data);
		if("".equals(dataStr)) {
			return null;
		}
		return new Integer(dataStr);
	}

	/**
	 * checkJson：	传入需要必填校验的字符
	 * @param strs	void	TODO（参数说明）
	 * 创  建  人 ：CYQ
	 * 创建时间：2021年12月2日-上午10:13:47
	 * @throws Exception
	*/
	public static void checkNull(String[] strs,Map data) throws Exception {
		if(strs==null||strs.length==0) {
			return;
		}
		if(data==null||data.size()==0) {
			return;
		}
		StringBuffer errStr = new StringBuffer();
		String value;
		for(String key:strs) {
			value = initstr(data.get(key));
			if("".equals(value)) {
				errStr.append("["+key+"]");
			}
		}
		if(!"".equals(initstr(errStr))) {
			throw new Exception("以下字段不能为空"+errStr+"!");
		}
	}
	/** JSON格式的String转MAP
	 * @throws BusinessException */
//	public static Map initMap(Object str) throws Exception{
//		try {
//			return JSON.parseObject(initstr(str), HashMap.class);
//		} catch (Exception e) {
//			// TODO: handle exception
//			throw new Exception("初始化JSON失败,"+e.getMessage());
//		}
//	}
	/**
	 * 读取配置文件
	 * getWSAddress：	
	 * @return	Properties	TODO（参数说明）
	 * 创  建  人 ：lihy
	 * 创建时间：2018年8月27日-下午1:25:23
	 * @throws Exception
	 */
	public static Properties getWSAddress() throws Exception {
		props = new Properties();
		String filePath = System.getProperty("user.dir")+ "/resources/selftool.properties";
		InputStream in = null ;
			try {
				in = new BufferedInputStream (new FileInputStream(filePath));
				props.load(in);
	       } catch (IOException e) {
				throw new Exception("配置文件加载异常,"+e.getMessage());
			}
			return props;
	}
	
	/**
	 * 获取配置文件的参数
	 * getParameter：	
	 * @param key
	 * @return	String	TODO（参数说明）
	 * 创  建  人 ：lihy
	 * 创建时间：2018年8月27日-下午1:26:20
	 * @throws Exception
	 */
	public synchronized static String getParameter(String key) throws Exception{
		if(props != null ){
			String value = props.getProperty(key);
			if(value == null || value.isEmpty()) {
				throw new Exception("根据配置文件未获取到有效的参数【"+key+"】");
			}
			return props.getProperty(key);
		} else {
			return getWSAddress().getProperty(key);
		}
	}
	/**写入配置文件*/
	public synchronized static void setParameter(String key,String value,String memo) throws Exception{
		if(props == null ){
			getWSAddress();
		}
		String filePath = System.getProperty("user.dir")+ "/resources/selftool.properties";
		File file = new File(filePath);
		BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
		props.setProperty(key,value);
		props.store(outputStream,memo); // memo表示对此文件的注释说明
	}
	/**
	 * logStackTrace：	 记录异常堆栈
	 * @param e	void	TODO（参数说明）
	 * 创  建  人 ：CYQ
	 * 创建时间：2023年6月1日-下午4:01:22
	 */
	public static String errorStackTrace(Exception e) {
		return ExceptionUtils.getStackTrace(e);
	}
	/**
	 * 获取文件md5值
	 */
	public static String md5HashCode(String filePath) {
		try {
			InputStream fis = new FileInputStream(filePath);
			MessageDigest md = MessageDigest.getInstance("MD5");
			byte[] buffer = new byte[1024];
			int length = -1;
			while ((length = fis.read(buffer, 0, 1024)) != -1) {
				md.update(buffer, 0, length);
			}
			fis.close();
			//转换并返回包含16个元素字节数组,返回数值范围为-128到127
			byte[] md5Bytes = md.digest();
			BigInteger bigInt = new BigInteger(1, md5Bytes);
			return bigInt.toString(16);
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	public static boolean isWindows(){
		Properties props=System.getProperties(); //获得系统属性集

		String osName = props.getProperty("os.name"); //操作系统名称

		if(osName.toLowerCase().contains("linux")){

			return false;

		}else if(osName.toLowerCase().contains("windows")){

			return true;

		}else{

			throw new RuntimeException("服务器不是linux|windows操作系统");

		}
	}
}
